
// #include <iostream>
// #include <cstring>
// #include <ctime>
// #include <cassert>
// #include <errno.h>
// #include <unistd.h>
// #include <fcntl.h>
// #include <netinet/in.h>
// #include <arpa/inet.h>
// #include <sys/epoll.h>
// #include <sys/types.h>
// #include <sys/socket.h>

// using namespace std;

// int main()
// {
//     //建立连接
//     int _lissock = socket(AF_INET, SOCK_STREAM, 0);
//     sockaddr_in local;

//     local.sin_family = AF_INET;
//     local.sin_port = htons(8082);
//     local.sin_addr.s_addr = inet_addr("0.0.0.0");
//     bind(_lissock, (sockaddr*)(&local), sizeof(local));
//     listen(_lissock, 128);

//     int newfd = accept(_lissock, nullptr, nullptr);
//     cout << "new fd is : " << newfd << endl;

//     //建立事件监听
//     int efd = epoll_create(128);
//     epoll_event ev;
//     ev.data.fd = newfd;
//     ev.events = EPOLLIN;
//     epoll_ctl(efd, EPOLL_CTL_ADD, newfd, &ev);
//     epoll_event evs[256];

//     while(1)
//     {
//         int n = epoll_wait(efd,evs,1024,-1);
//         cout << "get " << n << " event" << endl;

//         for(int i = 0; i < n; i++)      //获取就绪事件并做相应处理
//         {
//             if((evs[i].events & EPOLLHUP))       //连接断开事件
//             {
//                 cout << "client closed" << endl;
//                 exit(2);
//             }       

//             //你的问题是什么？  我实在无法立即你的问题，你所有的现象都是符合代码逻辑的，你目前在纠结哪个点
//             cout << (evs[i].events & EPOLLHUP) << " ";//这个事件是具体什么事件你清楚吗？  你ctrl+c干掉客户端，发送的是什么，你清楚吗
//             // 一般情况来说，EPOLLHUP事件，是一种RST报文触发的事件
//             // 很多事件，在我们代码处理流程中，会将EPOLLHUP/EPOLLERR这些都会统一处理成EPOLLIN，按EPOLLIN的方式去处理
//             // 而客户端ctrl+c被干掉，是底层操作系统发起FIN，是一种正常关闭的请求方式，在EPOLLIN中处理时res==0，close（fd）
//             //RST，现在在学多路复用的话，那么就应该时学过了TCP了，TCP协议段格式中，有六种标志位，分别位URG/ACK/PSH/RST/SYN/FIN，所以，跟信号没有关系
//             //这一块不清楚的话，可以回头看下TCP内容
//             //你现在的问题有清楚了吗
//             cout << (evs[i].events & EPOLLERR) << " ";
//             cout << (evs[i].events & EPOLLRDHUP) << " ";
//             cout << (evs[i].events & EPOLLIN) << endl;

//             if((evs[i].events & EPOLLIN))        //读事件就绪
//             {
//                 char buffer[1024] = {0};
//                 int res = recv(newfd, buffer, 1024, MSG_DONTWAIT);
//                 if(res <= 0)
//                 {
//                     if(errno == EWOULDBLOCK || errno == EAGAIN)
//                     {
//                         exit(3);
//                     }
//                     cout << "recv: " << res << endl;
//                     //epoll_ctl(efd, EPOLL_CTL_DEL, newfd, nullptr);
//                     //sleep(5); 
//                 }
//                 else
//                 {
//                     cout << buffer << endl;
//                 }              
//             }
//         }
      
//     }

//     return 0;
// }